home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / ntfs / inode.h < prev    next >
C/C++ Source or Header  |  2005-10-18  |  7KB  |  188 lines

  1. /*
  2.  * inode.h - Defines for NTFS inode handling. Part of the Linux-NTFS project.
  3.  *
  4.  * Copyright (c) 2001,2002 Anton Altaparmakov
  5.  * Copyright (c) 2004-2005 Yura Pakhuchiy
  6.  *
  7.  * This program/include file is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU General Public License as published
  9.  * by the Free Software Foundation; either version 2 of the License, or
  10.  * (at your option) any later version.
  11.  *
  12.  * This program/include file is distributed in the hope that it will be
  13.  * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
  14.  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.  * GNU General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU General Public License
  18.  * along with this program (in the main directory of the Linux-NTFS
  19.  * distribution in the file COPYING); if not, write to the Free Software
  20.  * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  21.  */
  22.  
  23. #ifndef _NTFS_INODE_H
  24. #define _NTFS_INODE_H
  25.  
  26. /* Forward declaration */
  27. typedef struct _ntfs_inode ntfs_inode;
  28.  
  29. #include "types.h"
  30. #include "layout.h"
  31. #include "support.h"
  32. #include "volume.h"
  33.  
  34. /*
  35.  * Defined bits for the state field in the ntfs_inode structure.
  36.  * (f) = files only, (d) = directories only
  37.  */
  38. typedef enum {
  39.     NI_Dirty,        /* 1: Mft record needs to be written to disk. */
  40.  
  41.     /* The NI_AttrList* tests only make sense for base inodes. */
  42.     NI_AttrList,        /* 1: Mft record contains an attribute list. */
  43.     NI_AttrListDirty,    /* 1: Attribute list needs to be written to the
  44.                       mft record and then to disk. */
  45.     NI_Compressed,        /* 1: Inode is compressed. */
  46.     NI_Encrypted,        /* 1: Inode is encrypted. */
  47.     NI_Sparse,        /* 1: Inode is sparse. */
  48.     NI_FileNameDirty,    /* 1: FILE_NAME attributes need to be updated
  49.                       in the index. */
  50. } ntfs_inode_state_bits;
  51.  
  52. #define  test_nino_flag(ni, flag)       test_bit(NI_##flag, (ni)->state)
  53. #define   set_nino_flag(ni, flag)        set_bit(NI_##flag, (ni)->state)
  54. #define clear_nino_flag(ni, flag)      clear_bit(NI_##flag, (ni)->state)
  55.  
  56. #define test_and_set_nino_flag(ni, flag)    \
  57.                    test_and_set_bit(NI_##flag, (ni)->state)
  58. #define test_and_clear_nino_flag(ni, flag)    \
  59.                  test_and_clear_bit(NI_##flag, (ni)->state)
  60.  
  61. #define NInoDirty(ni)                  test_nino_flag(ni, Dirty)
  62. #define NInoSetDirty(ni)               set_nino_flag(ni, Dirty)
  63. #define NInoClearDirty(ni)             clear_nino_flag(ni, Dirty)
  64. #define NInoTestAndSetDirty(ni)          test_and_set_nino_flag(ni, Dirty)
  65. #define NInoTestAndClearDirty(ni)    test_and_clear_nino_flag(ni, Dirty)
  66.  
  67. #define NInoAttrList(ni)              test_nino_flag(ni, AttrList)
  68. #define NInoSetAttrList(ni)               set_nino_flag(ni, AttrList)
  69. #define NInoClearAttrList(ni)             clear_nino_flag(ni, AttrList)
  70.  
  71.  
  72. #define  test_nino_al_flag(ni, flag)     test_nino_flag(ni, AttrList##flag)
  73. #define   set_nino_al_flag(ni, flag)      set_nino_flag(ni, AttrList##flag)
  74. #define clear_nino_al_flag(ni, flag)    clear_nino_flag(ni, AttrList##flag)
  75.  
  76. #define test_and_set_nino_al_flag(ni, flag)    \
  77.                  test_and_set_nino_flag(ni, AttrList##flag)
  78. #define test_and_clear_nino_al_flag(ni, flag)    \
  79.                    test_and_clear_nino_flag(ni, AttrList##flag)
  80.  
  81. #define NInoAttrListDirty(ni)                test_nino_al_flag(ni, Dirty)
  82. #define NInoAttrListSetDirty(ni)             set_nino_al_flag(ni, Dirty)
  83. #define NInoAttrListClearDirty(ni)           clear_nino_al_flag(ni, Dirty)
  84. #define NInoAttrListTestAndSetDirty(ni)        test_and_set_nino_al_flag(ni, Dirty)
  85. #define NInoAttrListTestAndClearDirty(ni) test_and_clear_nino_al_flag(ni, Dirty)
  86.  
  87. #define NInoCompressed(ni)         test_nino_flag(ni, Compressed)
  88. #define NInoSetCompressed(ni)          set_nino_flag(ni, Compressed)
  89. #define NInoClearCompressed(ni)        clear_nino_flag(ni, Compressed)
  90.  
  91. #define NInoEncrypted(ni)         test_nino_flag(ni, Encrypted)
  92. #define NInoSetEncrypted(ni)          set_nino_flag(ni, Encrypted)
  93. #define NInoClearEncrypted(ni)        clear_nino_flag(ni, Encrypted)
  94.  
  95. #define NInoSparse(ni)             test_nino_flag(ni, Sparse)
  96. #define NInoSetSparse(ni)          set_nino_flag(ni, Sparse)
  97. #define NInoClearSparse(ni)        clear_nino_flag(ni, Sparse)
  98.  
  99. #define NInoFileNameDirty(ni)            \
  100.                       test_nino_flag(ni, FileNameDirty)
  101. #define NInoFileNameSetDirty(ni)        \
  102.                        set_nino_flag(ni, FileNameDirty)
  103. #define NInoFileNameClearDirty(ni)        \
  104.                      clear_nino_flag(ni, FileNameDirty)
  105. #define NInoFileNameTestAndSetDirty(ni)        \
  106.                   test_and_set_nino_flag(ni, FileNameDirty)
  107. #define NInoFileNameTestAndClearDirty(ni)    \
  108.                 test_and_clear_nino_flag(ni, FileNameDirty)
  109.  
  110. /*
  111.  * The NTFS in-memory inode structure. It is just used as an extension to the
  112.  * fields already provided in the VFS inode.
  113.  */
  114. struct _ntfs_inode {
  115.     u64 mft_no;        /* Inode / mft record number. */
  116.     MFT_RECORD *mrec;    /* The actual mft record of the inode. */
  117.     ntfs_volume *vol;    /* Pointer to the ntfs volume of this inode. */
  118.     unsigned long state;    /* NTFS specific flags describing this inode.
  119.                    See ntfs_inode_state_bits above. */
  120.     /*
  121.      * Attribute list support (for use by the attribute lookup functions).
  122.      * Setup during ntfs_open_inode() for all inodes with attribute lists.
  123.      * Only valid if NI_AttrList is set in state.
  124.      */
  125.     u32 attr_list_size;    /* Length of attribute list value in bytes. */
  126.     u8 *attr_list;        /* Attribute list value itself. */
  127.     /* Below fields are always valid. */
  128.     s32 nr_extents;        /* For a base mft record, the number of
  129.                    attached extent inodes (0 if none), for
  130.                    extent records this is -1. */
  131.     union {        /* This union is only used if nr_extents != 0. */
  132.         ntfs_inode **extent_nis;/* For nr_extents > 0, array of the
  133.                        ntfs inodes of the extent mft
  134.                        records belonging to this base
  135.                        inode which have been loaded. */
  136.         ntfs_inode *base_ni;    /* For nr_extents == -1, the ntfs
  137.                        inode of the base mft record. */
  138.     };
  139.  
  140.     void *private_data;    /* Temp: for directory handling */
  141.     int ref_count;
  142.  
  143.     /* Below 2 fields needed to update indexes. They valid if != -1. */
  144.     s64 data_size;
  145.     s64 allocated_size;
  146.  
  147.     time_t creation_time;
  148.     time_t last_data_change_time;
  149.     time_t last_mft_change_time;
  150.     time_t last_access_time;
  151. };
  152.  
  153. extern ntfs_inode *ntfs_inode_allocate(ntfs_volume *vol);
  154.  
  155. extern ntfs_inode *ntfs_inode_open(ntfs_volume *vol, const MFT_REF mref);
  156.  
  157. extern int ntfs_inode_close(ntfs_inode *ni);
  158.  
  159. extern ntfs_inode *ntfs_extent_inode_open(ntfs_inode *base_ni,
  160.         const MFT_REF mref);
  161.  
  162. extern int ntfs_inode_attach_all_extents(ntfs_inode *ni);
  163.  
  164. /**
  165.  * ntfs_inode_mark_dirty - set the inode (and its base inode if it exists) dirty
  166.  * @ni:        ntfs inode to set dirty
  167.  *
  168.  * Set the inode @ni dirty so it is written out later (at the latest at
  169.  * ntfs_inode_close() time). If @ni is an extent inode, set the base inode
  170.  * dirty, too.
  171.  *
  172.  * This function cannot fail.
  173.  */
  174. static __inline__ void ntfs_inode_mark_dirty(ntfs_inode *ni)
  175. {
  176.     NInoSetDirty(ni);
  177.     if (ni->nr_extents == -1)
  178.         NInoSetDirty(ni->base_ni);
  179. }
  180.  
  181. extern int ntfs_inode_sync(ntfs_inode *ni);
  182.  
  183. extern int ntfs_inode_add_attrlist(ntfs_inode *ni);
  184.  
  185. extern int ntfs_inode_free_space(ntfs_inode *ni, int size);
  186.  
  187. #endif /* defined _NTFS_INODE_H */
  188.